// 引入文件系统模块（fs）和流模块（stream）
const fs = require('fs');
const { Transform } = require('stream');

// 1. 准备源文件from.txt（若不存在则创建并写入测试内容）
const sourceContent = 'hello node.js stream! this is a test file. welcome to learn stream.';
fs.writeFileSync('from.txt', sourceContent, 'utf8');
console.log('已创建from.txt并写入测试内容');

// 2. 创建转换流：将输入的字符转换为大写
const upperCaseTransform = new Transform({
  transform(chunk, encoding, callback) {
    // chunk为读取到的数据块，转换为字符串后转大写
    const upperCaseChunk = chunk.toString().toUpperCase();
    // 将转换后的数据块传递给下一个流
    callback(null, upperCaseChunk);
  }
});

// 3. 创建可读流（读取from.txt）
const readableStream = fs.createReadStream('from.txt', 'utf8');

// 4. 创建可写流（写入to.txt，若文件已存在则覆盖）
const writableStream = fs.createWriteStream('to.txt', 'utf8');

// 5. 管道连接：可读流 -> 转换流 -> 可写流
readableStream.pipe(upperCaseTransform).pipe(writableStream);

// 监听流操作完成事件
writableStream.on('finish', () => {
  console.log('文件内容转换并写入完成！');
  console.log('to.txt内容：', fs.readFileSync('to.txt', 'utf8'));
});

// 监听错误事件
readableStream.on('error', (err) => console.error('可读流错误：', err));
writableStream.on('error', (err) => console.error('可写流错误：', err));
upperCaseTransform.on('error', (err) => console.error('转换流错误：', err));